//针对业务内接口请求

import axios from "axios";
// 创建axios实例
const axiosInstance = axios.create({
  baseURL: "/", // api 的 base_url
  timeout: 30000, // 请求超时时间
});

/**
 * axios请求拦截器
 * @param {object} config axios请求配置对象
 * @return {object} 请求成功或失败时返回的配置对象或者promise error对象
 * */
axiosInstance.interceptors.request.use(
  // config => config,
  (config) => {
    if (process.env.NODE_ENV !== "production") {
      return config;
    } else {
      // console.log('config', config);
      let requestHeader = {
        "X-Requested-With": "XMLHttpRequest",
        "sso-redirect-page": encodeURIComponent(window.location.href),
      };
      
      //判断是否生产环境及登录

      // eslint-disable-next-line
      config.headers = Object.assign(config.headers, requestHeader);
      return config;
    }
  },
  (error) => {
    // console.log(error); // for debug
    Promise.reject(error);
  }
);

/**
 * axios 响应拦截器
 * @param {object} response 从服务端响应的数据对象或者error对象
 * @return {object} 响应成功或失败时返回的响应对象或者promise error对象
 * */
axiosInstance.interceptors.response.use(
  // response => response,
  (response) => {
    if (process.env.NODE_ENV !== "production") {
      return response;
    } else {
      // console.log('response', response);

      if (
        response &&
        response.status === 200 &&
        response.data.code === "30002"
      ) {
        window.location.href = response.data.redirectUrl;
      } else if (
        response &&
        response.status === 200 &&
        response.data.code === "41001"
      ) {
        window.top.postMessage(
          {
            type: "sessionTimeout",
          },
          window.sessionStorage.getItem("portalOrigin")
        );
      }
      return response;
    }
  },
  (error) => {
    if (!(error && /timeout/.test(error.message))) {
      // window.location.href = `${window.location.origin}${window.location.pathname}#/yxError`;
    }
    return Promise.reject(error);
  }
);

/**
 * 请求发出后检查返回的状态码，统一捕获正确和错误的状态码，正确就直接返回response，错误就自定义一个返回对象
 * @param {object} response 响应对象
 * @return {object} 响应正常就返回响应数据否则返回错误信息
 * */
function checkStatus(response) {
  // 如果HTTP状态码正常，则直接返回数据
  if (
    response &&
    (response.status === 200 ||
      response.status === 304 ||
      response.status === 400)
  ) {
    return response; // 如果不需要除了data之外的数据，可以直接 return response.data;
  }

  // 异常状态下，把错误信息返回去
  return {
    status: -404,
    msg: "网络异常", // 或者直接response.statusText
  };
}

/**
 * 检查完状态码后需要检查后如果成功了就需要检查后端的状态码处理网络正常时后台语言返回的响应
 * @param {object} res 是后台返回的对象或者自定义的网络异常对象，不是http 响应对象
 * @return {object} 返回后台传过来的数据对象，包含code,message,data等属性，
 * */
function checkCode(response) {
  // 如果code异常(这里已经包括网络错误，服务器错误，后端抛出的错误)，可以弹出一个错误提示，告诉用户
  if (response.status === -404) {
    //
  }
  return response.data;
}

const get = (url, params) =>
  axiosInstance
    .request({
      method: "get",
      url,
      params,
      headers: {
        "X-Requested-With": "XMLHttpRequest",
        "Content-Type": "application/json; charset=UTF-8",
      },
    })
    .then((response) => checkStatus(response))
    .then((response) => checkCode(response));

const post = (url, data) =>
  axiosInstance
    .request({
      method: "post",
      url,
      data,
      headers: {
        "X-Requested-With": "XMLHttpRequest",
        "Content-Type": "application/json; charset=UTF-8",
      },
    })
    .then((response) => checkStatus(response))
    .then((response) => checkCode(response));

export default {
  get,
  post,
  axios,
  axiosInstance,
};
